package com.hut.oa.common;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

import com.hut.oa.model.bean.User;

/**
 * 服务端实现类
 * @author 朱嘉茵
 *
 */
@ServerEndpoint(value="/socket/{userId}")
@Component
public class WebSocketServer {
	
	private Session session;
	
	private static Map<Long, Session> sessionPool=new HashMap<>();//存放所有在线用户
	
	private static Map<String,Long> sessionIds=new HashMap<>();//用于存放所有在线用户的id
	
	/**
	 * 客户端初次连接时触发，为客户创建一个session
	 * @param session
	 * @param userId
	 */
	@OnOpen
	public void open(Session session,@PathParam(value="userId")Long userId){
		this.session=session;
		sessionPool.put(userId, session);
		sessionIds.put(session.getId(), userId);
	}
	
	/**
	 * 客户端向服务端发送信息时触发，接收信息
	 * @param message
	 */
	@OnMessage
	public void onMessage(String message){
		System.out.println("客户端发送来的消息："+message);
	}
	
	/**
	 * 客户端与服务端断开连接时触发，移除关于该客户端的session
	 */
	@OnClose
	public void onClose(){
		sessionPool.remove(sessionIds.get(session.getId()));
		sessionIds.remove(session.getId());
	}
	
	/**
	 * 错误时触发
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session,Throwable error){
		error.printStackTrace();
	}
	
	/**
	 * 服务端根据userId给客户端发送消息
	 * @param message
	 * @param userId
	 */
	public static void sendMessage(String message,Long userId){
		Session s=sessionPool.get(userId);
		try {
			if(s!=null){
				s.getBasicRemote().sendText(message);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取在线人数
	 * @return
	 */
	public static int getOnlineCount(){
		return sessionPool.size();
	}
	
	/**
	 * 获取在线用户
	 * @return
	 */
	public static String getOnlineUsers(){
		StringBuffer sb=new StringBuffer();
		for (String string : sessionIds.keySet()) {
			sb.append(sessionIds.get(string));
		}
		return sb.toString();
	}
	
	/**
	 * 向所有在线用户发送消息
	 * @param message
	 */
	public static void sendAll(String message){
		for (String string : sessionIds.keySet()) {
			sendMessage(message,sessionIds.get(string));
		}
	}

}
